package commonclass.comparator;




import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-04 9:49
 * @description
 *
 * 一、说明：Java中的对象只能使用== !=进行比较，不能使用>、<进行比较
 *         比较大小需要接口：Comparable或Comparator
 * 二、Comparable接口与Comparator接口的使用对比
 *     Comparable一旦指定，可以保证实现类在任何位置都可以比较大小
 *     Comparator临时指定一次
 *
 */
public class CompareTest {
    /**
     * comparable使用举例：String  自然排序
     * 1.像String、包装类等实现了Comparable接口，重写了compareTo(),给出比较两个对象大小的方法
     * 2.String等重写compareTo()后进行了从小到大的排序
     * 3.重写compareTo()的规则：
     *      如果当前对象this大于形参对象obj，返回正整数，小于返回负整数，相等返回0
     *4.自定义类需要排序可以实现Comparable接口重写compareTo方法，在compareTo(obj)方法指明如何排序
     *
     */
    @Test
    public void test1(){
        String[] arr=new String[]{"AA","KK","MM","GG","JJ","BB"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    @Test
    public void test2(){
        Goods[] arr=new Goods[4];
        arr[0]=new Goods("lenovoMouse",34);
        arr[1]=new Goods("dellMouse",43);
        arr[2]=new Goods("xiaomiMouse",12);
        arr[3]=new Goods("huaweiMouse",65);

        Arrays.sort(arr);//未实现Comparable接口无法使用Arrays的排序
        System.out.println(Arrays.toString(arr));

        //自定义排序：先按名称排序，名称相同按价格逆序
        Arrays.sort(arr, new Comparator<Goods>() {
            @Override
            public int compare(Goods o1, Goods o2) {
                if(o1.getName().equals(o2.getName())){
                    return -Double.compare(o1.getPrice(),o2.getPrice());
                }else{
                    return o1.getName().compareTo(o2.getName());
                }

            }
        });
        System.out.println(Arrays.toString(arr));
    }
    /**
     * Comparator接口的使用：定制排序
     *1.背景：
     * 当元素类型没有实现Comparable接口而又不方便修改代码；
     * 或实现了Comparable接口的排序规则不适合当前操作
     *2.重写compare(Object o1)方法，比较o1与o2大小
     *  方法返回正整数，则o1>o2 0相等，负整数相反
     *
     */
    @Test
    public void test3(){
        String[] arr=new String[]{"AA","KK","MM","GG","JJ","BB"};
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1 instanceof  String && o2 instanceof String){
                    String s1= (String)o1;
                    String s2=(String)o2;
                    return  -s1.compareTo(s2);
                }
                return 0;
            }
        });
        System.out.println(Arrays.toString(arr));

    }


}
